package step5;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * EchoClient 만들기 
 * server 와 1:1 로 지속적으로 통신하는 프로그램
 * 콘솔(System.in) 으로부터 데이터를 입력받아 
 * 서버에 데이터를 전송하고 
 * 다시 서버에서 보낸 데이터를 입력받아 
 * 콘솔에 지속적으로 출력하는 프로그램 
 * exit 를 입력하는 경우에는 클라이언트 프로그램 종료
 * (hint : Stream 생성 while(){} ) 
 * @author kosta-00-kangsa-001
 * coding 순서
 * 1. Socket(ip,port)
 * 2. Stream 생성 
 * 	  System.in -> InputStreamReader -> BufferedReader
 *    socket.getOutputStream() -> PrintWriter 
 *    socket.getInputStream() -> InputStreamReader -> BufferedReader
 * 3. while
 * 4. sysBr.readLine() : 콘솔로부터 데이터 읽어서 
 * 	   pw.println(str) : 서버에 데이터를 출력 
 * 	   br.readLine() : 서버에서 출력한 데이터를 입력받아 
 *     sysout(서버메세지) : 다시 출력한다.    
 */
public class EchoClient {
	private Socket socket;//일반 소켓
	private BufferedReader sysBr;//콘솔로부터 데이터 입력 스트림 
	private PrintWriter pw;//서버로 데이터를 출력시 사용할 스트림 
	private BufferedReader br;//서버에서 온 메세지를 입력시 사용할 스트림
	public void go() throws IOException{		
		try{
			socket=new Socket("127.0.0.1",5432);
			System.out.println("**EchoClient가 Server에 접속**");
			// 콘솔로부터 데이터를 입력받는 스트림을 생성 
			sysBr=new BufferedReader(new InputStreamReader(System.in));
			//true : autoflush --> autoflush를 true 로 주지 않으면 
			// close() 전까지는 데이터가 출력되지 않으므로 
			// 매 println() 할 때 즉시 데이터를 출력하기 위해 true 를 할당 
			pw=new PrintWriter(socket.getOutputStream(),true);
			//서버의 데이터를 입력받기 위한 스트림을 생성 
			br=new BufferedReader(
					new InputStreamReader(socket.getInputStream()));
			while(true){
				//콘솔로부터 데이터를 입력받아
				String mess=sysBr.readLine();
				// 만약 exit를 사용자가 입력한 경우 통신을 종료한다.
				if(mess.equals("exit")){
					System.out.println("통신 종료~");
					break;
				}
				//서버로 데이터를 출력하고
				pw.println(mess);
				//서버에서 보낸 데이터를 입력받아 
				// 콘솔에 출력한다. 
				System.out.println(br.readLine());
			}
		}finally{
			closeAll();
		}
	}
	public void closeAll() throws IOException{
		if(br!=null)
			br.close();		
		if(pw!=null)
			pw.close();
		if(sysBr!=null)
			sysBr.close();
		if(socket!=null)
			socket.close();
	}
	public static void main(String[] args) {
		EchoClient client=new EchoClient();
		try {
			client.go();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}








